//kickstart2018roundDproblem1
// O(N^2)超时
// 前缀和+滑动窗口，O(NlogN)，一边遍历一边查找
#include<bits/stdc++.h>
using namespace std;
long long solve(int &N, vector<long long> &candies, int &O, long long &D)
{
    vector<long long> sum;
    sum.push_back(0);
    for (int i = 0; i < N; ++i)
    {
        sum.push_back(sum.back() + candies[i]);
    }
     
    // 最大化[L, R]的和，满足两个条件
    int r = 1;
    int on = 0;
    multiset<long long> mt; //滚动数组，排序，甜度非负
    long long ans = INT_MIN;
    for (int i = 1; i <= N; ++i) //从当前第i位开始往后取
    {
        // 满足奇数个数条件的最右
        while (r <= N && on + (candies[r - 1] & 1) <= O)
        {
            mt.insert(sum[r]);
            on += (candies[r - 1]&1);
            r++;
        }
        if (r <= i) r = i + 1;
        else
        {
            multiset<long long>::iterator it = mt.lower_bound(D + sum[i - 1] + 1);
            // 不超过某值的最大值
            if (it != mt.begin())
            {
                it--;
                ans = max(ans, (*it) - sum[i - 1]);
            }
            mt.erase(mt.find(sum[i]));
            on -= (candies[i - 1]&1);
        }
    }
    return ans;
}
int main()
{
    int T;
    cin >> T;
    for (int ti = 1; ti <= T; ++ti)
    {
        int N, O;
        long long D;
        //        2 ≤ N ≤ 5 × 10^5.
        //        0 ≤ O ≤ N.
        //        -10^15 ≤ D ≤ 10^15. 如果不注意范围，输入时候就会出错
        //        0 ≤ X1, X2, A, B, C ≤ 10^9.
        //        1 ≤ M ≤ 109.
        cin >> N >> O >> D;
        long long X1, X2, A, B, C, M, L;
        cin >> X1 >> X2 >> A >> B >> C >> M >> L;
        vector<long long> xs;
        vector<long long> ss;
        xs.push_back(X1);
        xs.push_back(X2);
        int len = 2;
        for (int i = 2; i < N; ++i)
        {
            xs.push_back((A * xs[len - 1] + B * xs[len - 2] + C) % M);
            len++;
        }
        for (int i = 0; i < N; ++i)
        {
            ss.push_back(xs[i] + L);
        }
        long long res = solve(N, ss, O, D);
        if (res == INT_MIN)
        {
            cout << "Case #" << ti << ": IMPOSSIBLE" << endl;
        }
        else
        {
            cout << "Case #" << ti << ": " << res << endl;
        }
    }
    return 0;
}



// O(N^2)
// #include<bits/stdc++.h>
// using namespace std;
// long long solve(int &N, vector<long long> &candies, int &O, long long &D)
// {
//     long long maxSweet = INT_MIN; //要有这个意识，用long long
//     vector<long long> sum;
//     vector<int> odds;
//     sum.push_back(candies[0]);
//     if (candies[0] % 2 == 1) odds.push_back(1);
//     else odds.push_back(0);
//     for (int i = 1; i < N; ++i)
//     {
//         sum.push_back(sum.back() + candies[i]);
//         if (candies[i] % 2 == 1) odds.push_back(odds.back() + 1);
//         else odds.push_back(odds.back());
        
//     }
//     for (int i = 0; i < N; ++i)
//     {
//         for (int j = i + 1; j < N; ++j)
//         {
//             if (odds[j] - odds[i] > O || sum[j] - sum[i] > D) break;
//             if (sum[j] - sum[i] > maxSweet)
//                 maxSweet = max(sum[j] - sum[i], maxSweet);
//         }
//     }
//     return maxSweet;
// }
// int main()
// {
//     int T;
//     cin >> T;
//     for (int ti = 1; ti <= T; ++ti)
//     {
//         int N, O;
//         long long D;
//         //        2 ≤ N ≤ 5 × 10^5.
//         //        0 ≤ O ≤ N.
//         //        -10^15 ≤ D ≤ 10^15. 如果不注意范围，输入时候就会出错
//         //        0 ≤ X1, X2, A, B, C ≤ 10^9.
//         //        1 ≤ M ≤ 109.
//         cin >> N >> O >> D;
//         long long X1, X2, A, B, C, M, L;
//         cin >> X1 >> X2 >> A >> B >> C >> M >> L;
//         vector<long long> xs;
//         vector<long long> ss;
//         xs.push_back(X1);
//         xs.push_back(X2);
//         int len = 2;
//         for (int i = 2; i < N; ++i)
//         {
//             xs.push_back((A * xs[len - 1] + B * xs[len - 2] + C) % M);
//             len++;
//         }
//         for (int i = 0; i < N; ++i)
//         {
//             ss.push_back(xs[i] + L);
//         }
//         long long res = solve(N, ss, O, D);
//         if (res == INT_MIN)
//         {
//             cout << "Case #" << ti << ": IMPOSSIBLE" << endl;
//         }
//         else
//         {
//             cout << "Case #" << ti << ": " << res << endl;
//         }
//     }
//     return 0;
// }